package models

import (
	"encoding/json"
)

// -------获取菜单路由列表---------

type ResRouteInfo struct {
	Id int64 `gorm:"column:id" json:"id"` // ID

	ParentId int64 `gorm:"column:parent_id" json:"parentId"` // ParentId

	// 组件路径
	Component string `gorm:"column:component" json:"component"`
	// 路由名称
	Name string `gorm:"column:name" json:"name"`
	// 路由路径
	Path string `gorm:"column:route_path" json:"path"`
	// 跳转链接
	Redirect string `gorm:"column:redirect" json:"redirect"`
	// 【目录】只有一个子路由是否始终显示
	AlwaysShow int `gorm:"column:always_show" json:"alwaysShow"`
	// 是否隐藏(true-是 false-否)
	Hidden int `gorm:"column:visible" json:"hidden"`
	// ICON
	Icon string `gorm:"column:icon" json:"icon"`
	// 【菜单】是否开启页面缓存
	KeepAlive bool `gorm:"column:keep_alive" json:"keepAlive"`
	// 路由title
	Title string `gorm:"column:title" json:"title"`
	// 路由参数
	Params []map[string]string `gorm:"-" json:"params"` // 解析后的 JSON 数据：在 Params 字段上使用 gorm:"-"，表示该字段不会映射到数据库字段

	ParamsRaw string `gorm:"column:params" json:"-"` // 存储原始 JSON 数据

}

// RouteInfo ，路由对象
type RouteInfo struct {
	Id int64 `json:"id"` // ID

	ParentId int64 `json:"parentId"` // ParentId

	// 子路由列表
	Children []RouteInfo `json:"children,omitempty"`
	// 组件路径
	Component string    `json:"component"`
	Meta      RouteMeta `json:"meta"`
	// 路由名称
	Name string `json:"name"`
	// 路由路径
	Path string `json:"path"`
	// 跳转链接
	Redirect string `json:"redirect"`
}

// RouteMeta ，路由属性类型
type RouteMeta struct {
	// 【目录】只有一个子路由是否始终显示
	AlwaysShow bool `json:"alwaysShow"`
	// 是否隐藏(true-是 false-否)
	Hidden bool `json:"hidden"`
	// ICON
	Icon string `json:"icon"`
	// 【菜单】是否开启页面缓存
	KeepAlive bool `json:"keepAlive"`
	// 路由参数
	Params []map[string]string `json:"params"`
	// 路由title
	Title string `json:"title"`
}

func ConvertToRouteInfo(resRoutes []ResRouteInfo, rootID int64) []RouteInfo {
	var roots []RouteInfo

	// 初始化并填充所有节点，同时解析 ParamsRaw
	for _, route := range resRoutes {
		if route.Params == nil && route.ParamsRaw != "" {
			// 将 ParamsRaw JSON 字符串解析为 map
			//_ = json.Unmarshal([]byte(route.ParamsRaw), &route.Params)

			// 将 JSON 解析为 map
			var data3 map[string]string
			_ = json.Unmarshal([]byte(route.ParamsRaw), &data3)

			// 转换为指定格式
			//var result []map[string]string
			for key, value := range data3 {
				route.Params = append(route.Params, map[string]string{
					"key":   key,
					"value": value,
				})
			}

		}

		var AlwaysShowB bool
		if route.AlwaysShow == 0 {
			AlwaysShowB = false
		} else {
			AlwaysShowB = true
		}
		var HiddenB bool
		if route.Hidden == 0 {
			HiddenB = true
		} else {
			HiddenB = false
		}

		routeInfo := RouteInfo{
			Id:        route.Id,
			ParentId:  route.ParentId,
			Component: route.Component,
			Name:      route.Name,
			Path:      route.Path,
			Redirect:  route.Redirect,
			Meta: RouteMeta{
				AlwaysShow: AlwaysShowB,
				Hidden:     HiddenB,
				Icon:       route.Icon,
				KeepAlive:  route.KeepAlive,
				Params:     route.Params,
				Title:      route.Name,
			},
		}
		roots = append(roots, routeInfo)
	}

	return roots
}

// GetTreeNodes 获取树形结构
func GetTreeNodes(parentId int64, nodes []RouteInfo) []RouteInfo {
	var tree []RouteInfo
	for _, node := range nodes {
		if node.ParentId == parentId {
			// 查找当前节点的子节点
			node.Children = GetTreeNodes(node.Id, nodes)
			tree = append(tree, node)
		}
	}
	return tree
}

// -------获取菜单列表---------

type GetMenusQuery struct {
	// 关键字(菜单名称)
	Keywords string `form:"keywords" json:"keywords"`
}

// GetMenusRes 菜单视图对象
type GetMenusRes struct {

	// 子菜单
	Children []GetMenusRes `gorm:"-" json:"children,omitempty"`

	Id int64 `gorm:"column:id" json:"id"` // ID

	ParentId int64 `gorm:"column:parent_id" json:"parentId"` // ParentId

	// 组件路径
	Component string `gorm:"column:component" json:"component"`
	// ICON
	Icon string `gorm:"column:icon" json:"icon"`
	// 菜单ID
	// 菜单名称
	Name string `gorm:"column:name" json:"name"`
	// 按钮权限标识
	Perm string `gorm:"column:perm" json:"perm"`
	// 跳转路径
	Redirect string `gorm:"column:redirect" json:"redirect"`
	// 路由名称
	RouteName string `gorm:"column:route_name" json:"routeName"`
	// 路由路径
	RoutePath string `gorm:"column:route_path" json:"routePath"`
	// 菜单排序(数字越小排名越靠前)
	Sort int64 `gorm:"column:sort" json:"sort"`
	// 菜单类型
	Type string `gorm:"column:type" json:"type"`
	// 菜单是否可见(1:显示;0:隐藏)
	Visible int64 `gorm:"column:visible" json:"visible"`
}

// MenuType 菜单类型（1-菜单 2-目录 3-外链 4-按钮）
type MenuType string

const (
	Button  MenuType = "BUTTON"
	Catalog MenuType = "CATALOG"
	Extlink MenuType = "EXTLINK"
	Menu    MenuType = "MENU"
	Null    MenuType = "NULL"
)

func MapMenuType(dbType string) MenuType {
	switch dbType {
	case "1":
		return Menu
	case "2":
		return Catalog
	case "3":
		return Extlink
	case "4":
		return Button
	default:
		return Null
	}
}

func MapMenuTypeVal(dbType string) int {
	switch dbType {
	case "MENU":
		return 1
	case "CATALOG":
		return 2
	case "EXTLINK":
		return 3
	case "BUTTON":
		return 4
	default:
		return 0
	}
}

// GetTreeNodesMenus 获取树形结构
func GetTreeNodesMenus(parentId int64, nodes []GetMenusRes) []GetMenusRes {
	var tree []GetMenusRes
	for _, node := range nodes {
		if node.ParentId == parentId {
			// 查找当前节点的子节点
			node.Children = GetTreeNodesMenus(node.Id, nodes)
			tree = append(tree, node)
		}
	}
	return tree
}

// --- 获取菜单下拉 ---

// GetMenusOptionsRes 菜单下拉对象
type GetMenusOptionsRes struct {
	Id int64 `json:"value"` // ID
	// 菜单名称
	Name     string `json:"label"`
	ParentId int64  ` json:"-"` // ParentId
	// 子菜单
	Children []GetMenusOptionsRes `gorm:"-" json:"children,omitempty"`
}

// GetTreeNodesMenusOptions 获取树形下拉结构
func GetTreeNodesMenusOptions(parentId int64, nodes []GetMenusOptionsRes) []GetMenusOptionsRes {
	var tree []GetMenusOptionsRes
	for _, node := range nodes {
		if node.ParentId == parentId {
			// 查找当前节点的子节点
			node.Children = GetTreeNodesMenusOptions(node.Id, nodes)
			tree = append(tree, node)
		}
	}
	return tree
}

// --- 获取菜单表单数据 ---

type GetMenusFormPath struct {
	// 菜单ID
	ID int64 `json:"id"`
}

// MenuFormRes 菜单表单对象
type MenuFormRes struct {
	// 【目录】只有一个子路由是否始终显示
	AlwaysShow int64 `gorm:"column:always_show" json:"alwaysShow"`
	// 组件路径(vue页面完整路径，省略.vue后缀)
	Component string `gorm:"column:component" json:"component"`
	// 菜单图标
	Icon string `gorm:"column:icon" json:"icon"`
	// 菜单ID
	ID int64 `gorm:"column:id" json:"id"`
	// 【菜单】是否开启页面缓存
	KeepAlive int64 `gorm:"column:keep_alive" json:"keepAlive"`
	// 菜单名称
	Name string `gorm:"column:name" json:"name"`
	// 父菜单ID
	ParentID int64 `gorm:"column:parent_id" json:"parentId"`
	// 权限标识
	Perm string `gorm:"column:perm" json:"perm"`
	// 跳转路径
	Redirect string `gorm:"column:redirect" json:"redirect"`
	// 路由名称
	RouteName string `gorm:"column:route_name" json:"routeName"`
	// 路由路径
	RoutePath string `gorm:"column:route_path" json:"routePath"`
	// 排序(数字越小排名越靠前)
	Sort int64 `gorm:"column:sort" json:"sort"`
	// 菜单类型（1-菜单 2-目录 3-外链 4-按钮）
	Type     string   `gorm:"column:type" json:"-"`
	MenuType MenuType `gorm:"-" json:"type"`
	// 显示状态(1:显示;0:隐藏)
	Visible int64 `gorm:"column:visible" json:"visible"`

	// 路由参数
	Params []map[string]string `gorm:"-" json:"params"` // 解析后的 JSON 数据：在 Params 字段上使用 gorm:"-"，表示该字段不会映射到数据库字段

	ParamsRaw string `gorm:"column:params" json:"-"` // 存储原始 JSON 数据
}

// ------- 新增菜单 --------

// AddMenusBody ，菜单表单对象
type AddMenusBody struct {
	// 【目录】只有一个子路由是否始终显示
	AlwaysShow int64 `gorm:"always_show:params" json:"alwaysShow,omitempty"`
	// 组件路径(vue页面完整路径，省略.vue后缀)
	Component string `gorm:"column:component" json:"component,omitempty"`
	// 菜单图标
	Icon string `gorm:"column:icon" json:"icon,omitempty"`
	// 菜单ID
	ID int64 `gorm:"column:id;primaryKey;autoIncrement" json:"-"`
	// 【菜单】是否开启页面缓存
	KeepAlive int64 `gorm:"column:keep_alive" json:"keepAlive"`
	// 菜单名称
	Name string `gorm:"column:name" json:"name,omitempty"`

	// 父菜单ID
	ParentID int64 `gorm:"parentId:params" json:"parentId,omitempty"`
	// 权限标识
	Perm string `gorm:"perm:params" json:"perm,omitempty"`
	// 跳转路径
	Redirect string `gorm:"redirect:params" json:"redirect,omitempty"`
	// 路由名称
	RouteName string `gorm:"route_name:params" json:"routeName,omitempty"`
	// 路由路径
	RoutePath string `gorm:"route_path:params" json:"routePath,omitempty"`
	// 排序(数字越小排名越靠前)
	Sort int64 `gorm:"column:sort" json:"sort,omitempty"`
	// 菜单类型（1-菜单 2-目录 3-外链 4-按钮）
	Type    string `gorm:"-" json:"type,omitempty"`
	TypeVal int    `gorm:"column:type" json:"-"`
	// 显示状态(1:显示;0:隐藏)
	Visible int64 `gorm:"column:visible" json:"visible"`

	// 路由参数 表单过来的值
	ParamsForm []ParamsKeyValue `gorm:"-" json:"params,omitempty"`
	// 路由参数 表单过来的值
	Params string `gorm:"column:params" json:"-"`
}

// ParamsKeyValue 键值对
type ParamsKeyValue struct {
	// 选项的值
	Key string `json:"key,omitempty"`
	// 选项的标签
	Value string `json:"value,omitempty"`
}
